package bgai.gui;

import java.awt.Image;
import java.io.Serializable;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import bgai.gamelogic.Backgammon;
import bgai.gamelogic.CheckerColor;
import bgai.gamelogic.PositionException;

/** Checker */
public class Checker extends JLabel implements Serializable {

	private static final long serialVersionUID = -2723663008930767031L;

	/**
	 * il colore del checker
	 */
	private CheckerColor color;
	
	/**
	 * L'immagine del checker nella versione base
	 */
	private ImageIcon imageChecker; 
	
	/**
	 * L'immagine del checker nella versione evidenziata
	 */
	private ImageIcon imageHighlighted;
	
	/**
	 * L'immagine del checker nella versione segnaposto
	 */
	private ImageIcon imagePlaceholder;
	
	/**
	 * true se la pedina e' evidenziata nell'interfaccia grafica, false altrimenti
	 */
	private boolean isHighlighted;
	
	/**
	 * true se e' un checker segnaposto;
	 */
	private boolean isPlaceHolder;
	
	/**
	 * La posizione del checker
	 * Backgammon.BAR se e' sul bar, da 1 a 24 se e' su un point, Backgammon.OFF se e' uscita
	 */
	private int position;
	
	/**
	 * Costruttore della pedina
	 * @param colorePedina il colore da associare alla pedina
	 */
	public Checker(CheckerColor col){
	
		this.color=col;
		
		this.isHighlighted=false;
		this.isPlaceHolder=false;
		
		imagePlaceholder = new ImageIcon(Checker.class.getResource("/img/placeHolder.png")); 
		
		if(col==CheckerColor.WHITE){ //checker bianco
			
			imageChecker = new ImageIcon(Checker.class.getResource("/img/whitePawn.png")); 
			imageHighlighted = new ImageIcon(Checker.class.getResource("/img/whitePawnHig.png")); 
		}
			
		else{ //checker nero
			
			imageChecker = new ImageIcon(Checker.class.getResource("/img/blackPawn.png")); 
			imageHighlighted = new ImageIcon(Checker.class.getResource("/img/blackPawnHig.png")); 
		}
		
	}
	
	/**
	 * Costruttore della pedina
	 * @param col il colore da associare alla pedina
	 * @param position la posizione della pedina (vedi metodo setPosition())
	 */
	public Checker(CheckerColor col, int position){
		
		this(col);
		setPosition(position);
		
	}
	
	/** Ritorna il colore del checker 
	 * @return vedi descrizione 
	 */
	public CheckerColor getColor(){
		
		return this.color;
	}
	
	/**
	 * Restituisce la posizione del checker
	 * @return Backgammon.BAR se e' sul bar, da 1 a 24 se e' su un point, Backgammon.OFF se e' uscita
	 */
	public int getPosition(){
		
		return position;
		
	}
	
	/**
	 * Restituisce true se il checker e' evidenziato, false altrimenti
	 * @return vedi descrizione metodo
	 */
	public boolean isHighlighted(){
		
		return this.isHighlighted;
	}
	
	
	/**
	 * Restituisce true se il checker e' un placeHolder, false altrimenti
	 * @return vedi descrizione metodo
	 */
	public boolean isPlaceHolder(){
		
		return this.isPlaceHolder;
	}
	
	
	/**
	 * Setta la posizione del checker sulla tavola
	 * @param position Backgammon.BAR se e' sul bar, da 1 a 24 se e' su un point, Backgammon.OFF se e' uscita
	 */
	private void setPosition(int position){
		
		if(!Backgammon.checkPosition(position)){
			
			throw new PositionException(position, "La posizione del checker deve essere settata tra 1 e 24 oppure con le costanti Backgammon.OFF o Backgammon.BAR");
		}
		
		this.position=position;
		
	}
	
	/**
	 * Ottieni l'immagine associata al checker scalata come specificato nei paramteri h e w
	 * se uno dei due parametri e' -1 l'immagine viene scalata in proporzione all'altro parametro specificato
	 * @param w larghezza dell'immagine
	 * @param h altezza dell'immagine
	 * @return vedi descrizione
	 */
	public ImageIcon getScaledImage(int w, int h){
		Image tmpImg= imageChecker.getImage();
		tmpImg= tmpImg.getScaledInstance(w, h, Image.SCALE_SMOOTH);
		return new ImageIcon(tmpImg);
	}
	
	/**
	 * Restituisce l'immagine del checker nella versione evidenziata scalata come specificato nei paramteri h e w
	 * se uno dei due parametri e' -1 l'immagine viene scalata in proporzione all'altro parametro specificato
	 * @param w larghezza dell'immagine
	 * @param h altezza dell'immagine
	 * @return vedi descrizione
	 */
	public ImageIcon getHighlightedImage(int w, int h){
		
		Image tmpImg= imageHighlighted.getImage();
		tmpImg= tmpImg.getScaledInstance(w, h, Image.SCALE_SMOOTH);
		return new ImageIcon(tmpImg);
		
	}
	
	
	/**
	 * Imposta l'immagine base del checker
	 * @param w larghezza dell'immagine de checker
	 * @param h altezza dell'immagine del checker
	 * @return l'immagine del checker scalata come specificato nei paramteri h e w
	 */
	public ImageIcon setScaledImage(int w, int h){
		this.isPlaceHolder=false;
		this.isHighlighted=false;
		return scaleImg(imageChecker,w,h);

	}
	
	
	/**
	 * Imposta l'immagine del checker nella versione evidenziata
	 * @param w larghezza dell'immagine de checker
	 * @param h altezza dell'immagine del checker
	 * @return l'immagine del checker nella versione evidenziata scalata come specificato nei paramteri h e w o null se il checker e' un placeholder
	 */
	public ImageIcon setHighlightedImage(int w, int h){
		
		// se e' un checker segnaposto non posso evidenziarlo
		if(this.isPlaceHolder) return null;
		
		this.isHighlighted=true;
		return scaleImg(imageHighlighted,w,h);

	}
	
	
	/**
	 * Imposta l'immagine del checker nella versione placeHolder
	 * @param w larghezza dell'immagine de checker
	 * @param h altezza dell'immagine del checker
	 * @return l'immagine del checker nella versione placeHolder scalata come specificato nei paramteri h e w
	 */
	public ImageIcon setPlaceholderImage(int w, int h){
		
		this.isPlaceHolder=true;
		this.isHighlighted=false;
		return scaleImg(imagePlaceholder,w,h);
	}
	
	
	/**
	 * Restituisce un'ImageIcon scalata a partire da quella di partenza passata come parametro
	 * @param imgIcon l'immagine da scalare
	 * @return vedi descrizione metodo
	 */
	private ImageIcon scaleImg(ImageIcon imgIcon, int w, int h){
		
		Image tmpImg= imgIcon.getImage();
		tmpImg= tmpImg.getScaledInstance(w, h, Image.SCALE_SMOOTH);
		ImageIcon imgIc = new ImageIcon(tmpImg);
		setIcon(imgIc);
		setAlignmentX(CENTER_ALIGNMENT);
		revalidate();
		return imgIc;
	}
	
	
	
	
}
